iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
Claude AI

用 Claude 帶我 Bring Up AI 開發板:30 天人機協作實錄系列 第 9 篇

[Day 9] 百尺竿頭,再進一步:Teensy 4.1 Smoke Test

  • 分享至 

  • xImage
  •  

當然,我只花了大概半小時就讓Teensy 動了起來,也許有Arduino的基礎,少了安裝Arduino的步驟,但加上安裝,要讓一塊陌生的板子DIY到實際運作,以前可能要查資料,老師再教一下,寫個code,至少要半天,現在不到1小時就完成,效率真的加倍了!

下一步,除了基本的Led外,就要進入到Pin腳測試了,這麼強大的MCU,不拿來實作一下怎麼行?

接下來我請claude code給我更大範圍的Smoke Test!

/*
 * Teensy 4.1 Smoke Test: PWM & TACH Simulation
 * 驗證硬體確定性與非阻塞中斷架構
 */

// --- 腳位定義 ---
const uint8_t pwmPins[] = {2, 3, 4};   // 模擬 3 通道風扇控制
const uint8_t tachInputPin = 10;       // 讀取 TACH 脈衝 (中斷腳)
const uint8_t tachSimPin = 14;         // 產生假 TACH 方波

// --- 系統常數 ---
const uint32_t PWM_FREQ = 25000;       // 風扇標準 25kHz
const uint32_t TACH_SIM_FREQ = 500;    // 模擬頻率 (500Hz -> 15000 RPM)

// --- 共用變數 (必須使用 volatile 供中斷使用) ---
volatile uint32_t tachPulseCount = 0;
uint16_t currentRPM = 0;
uint8_t currentDutyCycle = 0; // 0-255

// --- 中斷服務常式 (ISR) ---
void tachISR() {
  tachPulseCount++; // 極致瘦身,只做計數
}

void setup() {
  Serial.begin(115200);

  // 1. 初始化 PWM 輸出
  analogWriteResolution(8); // 8-bit 解析度 (0-255)
  for (int i = 0; i < 3; i++) {
    pinMode(pwmPins[i], OUTPUT);
    analogWriteFrequency(pwmPins[i], PWM_FREQ);
    analogWrite(pwmPins[i], 0); // 初始為 0 (LED 滅)
  }

  // 2. 初始化 TACH 模擬輸出 (自產自銷方波)
  pinMode(tachSimPin, OUTPUT);
  analogWriteFrequency(tachSimPin, TACH_SIM_FREQ);
  analogWrite(tachSimPin, 128); // 50% 佔空比方波

  // 3. 初始化 TACH 讀取中斷
  pinMode(tachInputPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(tachInputPin), tachISR, FALLING);
}

// 用於非阻塞計時
uint32_t lastCalcTime = 0;
uint32_t lastLEDTime = 0;

void loop() {
  uint32_t now = millis();

  // 任務一:每秒結算一次 RPM (模擬上位機讀取)
  if (now - lastCalcTime >= 1000) {
    lastCalcTime = now;

    // 關鍵:短暫關閉中斷以安全複製數據
    noInterrupts();
    uint32_t pulses = tachPulseCount;
    tachPulseCount = 0;
    interrupts();

    // 計算 RPM (假設 1 轉 2 脈衝)
    currentRPM = (pulses * 60) / 2;

    Serial.print("目前設定 PWM (%): ");
    Serial.print((currentDutyCycle * 100) / 255);
    Serial.print(" | 偵測轉速 (RPM): ");
    Serial.println(currentRPM);
  }

  // 任務二:讓 LED 呼吸燈效應 (模擬動態改變 PWM 設定)
  if (now - lastLEDTime >= 10) {
    lastLEDTime = now;

    // 改變 Duty Cycle (0->255->0 循環)
    static int8_t fadeAmount = 1;
    currentDutyCycle += fadeAmount;
    if (currentDutyCycle == 0 || currentDutyCycle == 255) {
      fadeAmount = -fadeAmount;
    }

    // 套用至 3 個通道
    for (int i = 0; i < 3; i++) {
      analogWrite(pwmPins[i], currentDutyCycle);
    }
  }
}

實際看到3顆PWM的LEDs在同時在fade in/fade out,及透過serial port印在螢幕上的轉速,還是蠻感動的!

https://ithelp.ithome.com.tw/upload/images/20260922/20118900wMDKiHh0fE.png
Figure 1: PWM Pin 2,3,4 with 3 Green leds fade in

https://ithelp.ithome.com.tw/upload/images/20260922/20118900my3retCGln.png
Figure 2: PWM Pin 2,3,4 with 3 Green leds fade out


上一篇
[Day 8] 接下來才是重點!Teensy Led Blinking
下一篇
[Day 10] 那更複雜的呢?挑戰FRDM-RW612
系列文
用 Claude 帶我 Bring Up AI 開發板:30 天人機協作實錄 共 12 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言